package com.doubleview.demo
/**
 * @author huchengchao@kuaishou.com
 * Created on 2021-11-20
 */
//=======================闭包柯里化=======================
Closure<Integer> expr = { x, y, z -> (x + y) * z }
// z 不总是变化
expr(2, 3, 3)
expr(1, 6, 3)
expr(1, 5, 3)
expr(5, 9, 3)

//我们希望闭包 expr 在一段时间之内记住 z 的值，以此来避免枯燥的重复传参
expr = {
    z ->
        // 对于这个闭包而言，z 是自由变量。
        return { x, y ->
            (x + y) * z
        }
}
def result = expr(3)(2, 3)

// (x + y) * 3
def memoried_z = expr 3
memoried_z(2, 3)  // expr(2,3,3)
memoried_z(1, 6)  // expr(1,6,3)
memoried_z(1, 5)  // expr(1,5,3)
memoried_z(5, 9)  // expr(5,9,3)

//=======================便捷的柯里化转换方法=======================
expr = { x, y, z -> (x + y) * z }

// 返回一个新的表达式： ( 3 + 2 ) * z => 5z
expr1 = expr.curry(3, 2)

// 10
println expr1(2)

// 返回一个新的表达式: (1 + 2) * 3 = 9
println expr.curry(1, 2, 3)()

expr = { x, y, z -> (x + y) * z }

// 如果要从后向前开始柯里化，则需使用 rcurry() 方法：
// expr = (x + 3) * 2
expr1 = expr.rcurry(3, 2)

// 12
println expr1(3)


// 从前面的第 k 个参数开始柯里化
expr = { x, y, z -> (x + y) * z }

// expr1 = (x + 3) * 2
expr1 = expr.ncurry(1, 3, 2)

// 10
println expr1(2)
